package controller

import (
	"fmt"
	"frontend-server/dao"
	"frontend-server/util"

	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
)

type UserController struct{}

type UserInfoEditFormStruct struct {
	Nickname string `json:"nickname"`
	Sex      int    `json:"sex"`
	// Birthday string `json:"birthday"`
}

// 查询用户信息
func (UserController) UserInfo(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	username, _ := ctx.Get("username")
	user, err := dao.GetGvImUserByUsernameOrId(cast.ToUint(id), cast.ToString(username))
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常: %c" + err.Error(),
			},
		})
		return
	}
	data := dao.UserInfoResult{
		ID:       user.ID,
		Nickname: user.Nickname,
		Username: user.Username,
		Fullname: user.Fullname,
		Birthday: user.Birthday,
		Email:    user.Email,
		Phone:    user.Phone,
		Sex:      user.Sex,
		Avatar:   user.Avatar,
	}
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "获取成功",
			Params: gin.H{
				"data": data,
			},
		},
	})
}

// 修改用户信息
func (UserController) ModifyUserInfo(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	var userInfo UserInfoEditFormStruct
	err := ctx.BindJSON(&userInfo)
	fmt.Println(userInfo)
	if err != nil {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "参数解析异常: " + err.Error(),
			},
		})
		return
	}
	if userInfo.Nickname != "" {
		err := dao.ModifyGvImUserByNickname(cast.ToUint(id), userInfo.Nickname)
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常: " + err.Error(),
			},
		})
		return
	}
	if userInfo.Sex != 0 {
		err := dao.ModifyGvImUserBySex(cast.ToUint(id), userInfo.Sex)
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常: " + err.Error(),
			},
		})
		return
	}
	// if userInfo.Birthday != "" {
	// 	err := dao.ModifyGvImUserByBirthday(cast.ToUint(id), userInfo.Birthday)
	// 	util.Fail(ctx, util.R{
	// 		P: util.P{
	// 			Code:    500,
	// 			Message: "系统异常: " + err.Error(),
	// 		},
	// 	})
	// 	return
	// }
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "修改成功",
		},
	})
}

// 修改用户密码
func (UserController) ModifyPassword(ctx *gin.Context) {
	id, _ := ctx.Get("id")
	username, _ := ctx.Get("username")
	oldPassword, bOldPassword := ctx.GetPostForm("old_password")
	newPassword, bNewPassword := ctx.GetPostForm("new_password")
	if !bOldPassword {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "旧密码不能为空",
			},
		})
		return
	}
	if !bNewPassword {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "新密码不能为空",
			},
		})
		return
	}
	giu, err := dao.GetGvImUserByUsernameOrId(cast.ToUint(id), cast.ToString(username))
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    500,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	b := util.CompareHashAndPassword(giu.Password, oldPassword)
	if !b {
		util.Success(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "旧密码不正确",
			},
		})
		return
	}
	gNewPassword, err := util.GenerateFromPassword(newPassword)
	if err != nil {
		util.Fail(ctx, util.R{
			P: util.P{
				Code:    -1,
				Message: "系统异常:" + err.Error(),
			},
		})
		return
	}
	dao.ModifyGvImUserByPassword(cast.ToUint(id), gNewPassword)
	util.Success(ctx, util.R{
		P: util.P{
			Code:    200,
			Message: "修改成功",
		},
	})
}

// 修改用户头像
